/******************************************************************************
 * Copyright (C) 2011 ShenZhen ComTop Information Technology Co.,Ltd
 * All Rights Reserved.
 * 本软件为深圳康拓普开发研制。未经本公司正式书面同意，其他任何个人、团体不得使用、
 * 复制、修改或发布本软件.
 *****************************************************************************/

package com.code.common.nosql;

import org.apache.commons.pool.PoolableObjectFactory;

/**
 * MongoDB工厂
 * 
 * @author 郑重
 * @since 1.0
 * @version 2010-10-27 郑重
 */
public class MongoDBObjectFactory implements PoolableObjectFactory {
    
    /**
     * URL
     */
    private String url;
    
    /**
     * 端口号
     */
    private int port;
    
    /**
     * 数据库
     */
    private String database;
    
    /**
     * 用户名
     */
    private String userName;
    
    /**
     * 密码
     */
    private String password;
    
    /**
     * 创建对象实例。同时可以分配这个对象适用的资源。
     * 
     * @return MongoDBService服务对象
     * @see org.apache.commons.pool.PoolableObjectFactory#makeObject()
     */
    public Object makeObject() {
        return new MongoDBService(url, port, database, userName, password);
    }
    
    /**
     * 激活一个对象。
     * 
     * @param obj 待激活对象
     * @throws Exception 激活异常
     * @see org.apache.commons.pool.PoolableObjectFactory#activateObject(java.lang.Object)
     */
    public void activateObject(Object obj) throws Exception {
    }
    
    /**
     * 销毁对象，实际上提供了释放对象占用资源的接口。
     * 
     * @param obj 待销毁对象
     * @throws Exception 销毁异常
     * @see org.apache.commons.pool.PoolableObjectFactory#destroyObject(java.lang.Object)
     */
    public void destroyObject(Object obj) throws Exception {
        ((MongoDBService) obj).close();
    }
    
    /**
     * @return 获取 database属性值
     */
    public String getDatabase() {
        return database;
    }
    
    /**
     * @return 获取 password属性值
     */
    public String getPassword() {
        return password;
    }
    
    /**
     * @return 获取 port属性值
     */
    public int getPort() {
        return port;
    }
    
    /**
     * @return 获取 url属性值
     */
    public String getUrl() {
        return url;
    }
    
    /**
     * @return 获取 userName属性值
     */
    public String getUserName() {
        return userName;
    }
    
    /**
     * 挂起一个对象
     * 
     * @param obj 待挂起对象
     * @throws Exception 挂起异常
     */
    public void passivateObject(Object obj) throws Exception {
    }
    
    /**
     * @param database 设置 database 属性值为参数值 database
     */
    public void setDatabase(String database) {
        this.database = database;
    }
    
    /**
     * @param password 设置 password 属性值为参数值 password
     */
    public void setPassword(String password) {
        this.password = password;
    }
    
    /**
     * @param port 设置 port 属性值为参数值 port
     */
    public void setPort(int port) {
        this.port = port;
    }
    
    /**
     * @param url 设置 url 属性值为参数值 url
     */
    public void setUrl(String url) {
        this.url = url;
    }
    
    /**
     * @param userName 设置 userName 属性值为参数值 userName
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }
    
    /**
     * 这个方法一般在 activateObject 方法执行后调用 检查对象的有效性
     * 
     * @param obj 检查对象
     * @return 对象是否有效，此处返回true
     */
    public boolean validateObject(Object obj) {
        return true;
    }
}
